package liangtWorkSpace.lambda;

/**
 * @ClassName LambdaEG
 * @Description : 功能说明
 * @Author : LiangT
 * @Date : 2020/4/20 19:03
 */

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

import static java.util.Comparator.comparing;

/**
 * 复用lambda示例
 */
public class LambdaEG {

    public static void main(String[] args) {
    }

    private static void function() {
        Function<Integer, Integer> f = x -> x + 1;
        Function<Integer, Integer> g = x -> x * 1;
        Function<Integer, Integer> h = f.andThen(g);
        System.out.println(h.apply(1));
    }

    /**
     * 比较复合器，
     * 如果你想要对苹果按重量递减排序怎么办？用不着去建立另一个Comparator的实例。接口 有一个默认方法reversed可以使给定的比较器逆序。因此仍然用开始的那个比较器，
     * 只要修改 一下前一个例子就可以对苹果按重量递减排序：
     * <p>
     * 上面说得都很好，但如果发现有两个苹果一样重怎么办？哪个苹果应该排在前面呢？你可能 需要再提供一个Comparator来进一步定义这个比较。比如，在按重量比较两个苹果之后，你可 能想要按原产国排序。thenComparing方法就是做这个用的。它接受一个函数作为参数（就像 comparing方法一样），如果两个对象用第一个Comparator比较之后是一样的，就提供第二个 Comparator。你又可以优雅地解决这个问题了：
     */
    private static void reversed() {
        List<Apple> inventory = new ArrayList<>();
        inventory.sort(comparing(Apple::getColor).reversed().thenComparing(Apple::getColor));
    }

    /**
     * 复习lambda使用
     */
    private static void fuxi() {
        List<Apple> inventory = new ArrayList<>();
        //匿名内部类实现
        inventory.sort(new Comparator<Apple>() {
            @Override
            public int compare(Apple o1, Apple o2) {
                return o1.getColor().compareTo(o2.getColor());
            }
        });
        //使用Lambda实现
        inventory.sort((Apple a, Apple b) -> a.getColor().compareTo(b.getColor()));
        //代码紧凑
        inventory.sort(comparing((a) -> a.getWeight()));
        //使用方法引用
        inventory.sort(comparing(Apple::getWeight));
    }
}

/**
 * 函数复合调用
 */
class Letter {

    public static String addHeader(String text) {
        return "From Raoul, Mario and Alan: " + text;
    }

    public static String addFooter(String text) {
        return text + " Kind regards";
    }

    public static String checkSpelling(String text) {
        return text.replaceAll("labda", "lambda");
    }

    public static void main(String[] args) {
        Function<String,String> function = Letter::addFooter;
        Function<String,String> function1 = function.andThen(Letter::checkSpelling).andThen(Letter::addHeader);

        System.out.println(function1.apply("我在测试"));
    }
}
